from . import webs
from web.model.questionnaire_model import Questionnaire, Question, Options, Completed, Completion
from web.model.user_model import User
from web.control.error.error_code import Success, RootException, SQLMissException
from web.control.route.func import get_args


@webs.route('/allQuestionnaire/', methods=['GET'])
def query_all_questionnaire():
    """
    返回问卷表的所有数据

    :return: 成功则返回请求对应的数据或提示性信息，报错则返回相应的异常信息
    """
    result = Questionnaire.query_all(Questionnaire)
    return Success(data=result)


@webs.route('/allQuestion/', methods=['GET'])
def query_all_question():
    """
    返回问题表所有的数据

    :return: 成功则返回请求对应的数据或提示性信息，报错则返回相应的异常信息
    """
    result = Question.query_all(Question)
    return Success(data=result)


@webs.route('/allOptions/', methods=['GET'])
def query_all_options():
    """
    返回选项表所有的数据

    :return: 成功则返回请求对应的数据或提示性信息，报错则返回相应的异常信息
    """
    result = Options.query_all(Options)
    return Success(data=result)


@webs.route('/allCompleted/', methods=['GET'])
def query_all_completed():
    """
    返回所有已填问卷表的数据

    :return: 成功则返回请求对应的数据或提示性信息，报错则返回相应的异常信息
    """
    result = Completed.query_all(Completed)
    return Success(data=result)


@webs.route('/allUser/', methods=['GET'])
def query_all_user():
    """
    返回用户表的所有数据

    :return: 成功则返回请求对应的数据或提示性信息，报错则返回相应的异常信息
    """
    result = User.query_all(User)
    return Success(data=result)


@webs.route('/userAccount/', methods=['GET'])
def check_user_account():
    """
    校验用户登录账号和密码是否正确

    :return: 正确返回token，错误返回异常
    """
    account = get_args('userAccount')
    password = get_args('passWord')
    try:
        result = User.query.filter(User.userAccount == account).first()
    except Exception as error:
        raise SQLMissException(code=200, msg='数据库查询不到账户信息')
    if not result:
        raise SQLMissException(code=200, msg='数据库查询不到账户信息')
    if result.passWord == password:
        # TODO token的设计还未完成，token的作用是用于权限限定，可以模仿一般的问卷进行设定，自由发挥，推荐使用自定义装饰器
        return Success(data=result.root, msg='用户登录成功')
    else:
        return RootException(msg='用户登录失败')


@webs.route('/questionnaireContent/', methods=['GET'])
def get_questionnaire_content():
    """
    通过获取的问卷id返回整张问卷的所有信息（问卷表，问题表，选项表的所有数据）

    :return: 成功则返回所有数据，失败则抛出异常
    """
    questionnaire_id = get_args('questionnaireId')
    question_result = Question.query.filter(Question.questionnaireId == questionnaire_id).all()
    question_data = Question.query_data(question_result)
    for i in question_data:
        try:
            option_result = Options.query.filter(Options.questionId == i['id']).all()
        except Exception as error:
            raise SQLMissException(msg='选项查询出错\n'+error)
        option_data = Options.query_data(option_result)
        i['optionData'] = option_data
    return Success(data=question_data)


@webs.route('/allCompletion/', methods=['GET'])
def get_all_completion():
    """
    获取所有的填空题数据

    :return: 成功则返回所有数据，失败则抛出异常
    """
    questionnaire_id = get_args('questionnaireId')
    question_info = {}
    try:
        info = Question.query.filter(Question.questionnaireId == questionnaire_id and Question.type == 3).all()
        print(info)
        print(type(info))
        data = Completion.query.filter(Completion.questionnaireId == questionnaire_id).all()
    except Exception as error:
        raise SQLMissException(msg=error)
    for cls in info:
        question_info[cls.id] = cls.questionName
    data_list = Question.query_data(data)
    for data in data_list:
        data['questionName'] = question_info[data['questionId']]
    return Success(data=data_list, msg='查询成功')


@webs.route('/count/', methods=['GET'])
def get_commit_count():
    """
    获取问卷的填写人数

    :return: 成功则返回所有数据，失败则抛出异常
    """
    questionnaire_id = get_args('questionnaireId')
    try:
        count = Completed.query.filter(Completed.questionnaireId == questionnaire_id).count()
    except Exception as error:
        raise SQLMissException(code=200, msg=error)
    return Success(data=count)

